package com.gosophia.dataDictionary.ws;

import java.util.List;

import com.gosophia.commons.OrderCondition;
import com.gosophia.commons.Page;
import com.gosophia.commons.exception.BusinessException;
import com.gosophia.commons.exception.ConcurrencyException;
import com.gosophia.commons.exception.ParameterException;
import com.gosophia.commons.exception.TechnicalException;
import com.gosophia.dataDictionary.dto.DataEntryDTO;
import com.gosophia.dataDictionary.dto.DataValueDTO;

/**
 * 数据字典WebService接口设计
 * 
 * @author nana
 * 
 */
public interface DataDictionaryWebService {

    /**
     * 查找词条，如果没有过滤条件，返回所有词条的分页信息;有过滤条件，返回满足条件的词条分页信息
     * 
     * @param pageNo
     *            页码 页码必须大于0
     * @param pageSize
     *            每页的最大记录条数 必须大于0
     * @param searchCon 模糊搜索条件            
     * @param orderConditions
     *            排序条件，可以为null;每个排序条件都是 OrderCondition类的一个对象 每个排序条件可以通过以下方法来创建
     *            OrderCondition or = new OrderCondition(propertyName,
     *            ascending); propertyName 实体属性名称（字符串类型）
     *            该接口可用属性名称有：entryName，entryNote ascending
     *            排序顺序（boolean类型），为true时代表升序，否则为降序
     * @return 返回满足条件的词条
     * @throws ParameterException,ConcurrencyException,TechnicalException
     */
    public Page<DataEntryDTO> findEntriesByPage(int pageNo, int pageSize,String searchCon,
            List<OrderCondition> orderConditions) throws ParameterException,ConcurrencyException,TechnicalException;

    /**
     * 根据词条Id返回启用的数据值集合
     * 
     * @param entryId
     *            不能为null
     * @return 返回根据词条Id查找的启用数据值集合（按排序号排序）
     * @throws ParameterException,ConcurrencyException,TechnicalException
     */
    public List<DataValueDTO> findEnabledDataValueByEntryId(Long entryId)
            throws ParameterException,ConcurrencyException,TechnicalException;

    /**
     * 根据词条id和数据值的key查询数据值
     * 
     * @param entryId
     *            不能为null
     * @param key
     *            不能为null
     * @return 返回根据词条id和数据值的key查询数据值，如果不存在返回null
     * @throws ParameterException,ConcurrencyException,TechnicalException
     */
    public DataValueDTO findDataValueByEntryIdAndKey(Long entryId, String key)
            throws ParameterException,ConcurrencyException,TechnicalException;

    /**
     * 添加数据值
     * 
     * @param dataValueDTO
     *            不能为null，dataValueDTO.dataValueId必须为null
     * @throws ParameterException,ConcurrencyException,TechnicalException
     *             ,当同一词条下的dataValueDTO.value重复或dataValueDTO.key重复时
     */
    public Long addDataValue(DataValueDTO dataValueDTO,Long toId)
            throws ParameterException,ConcurrencyException,TechnicalException, BusinessException;

    /**
     * 修改数据值
     * 
     * @param dataValue
     *            ，dataValueDTO.dataValueId不能为null
     * @throws ParameterException,ConcurrencyException,TechnicalException
     *             ,当同一词条下的dataValueDTO.value重复或dataValueDTO.key重复时
     */
    public void updateDataValue(DataValueDTO dataValueDTO)
            throws ParameterException,ConcurrencyException,TechnicalException, BusinessException;

    /**
     * 删除数据值
     * 
     * @param dataValueId
     *            不能为null;
     * @param version
     *            不能为null
     * @throws ParameterException,ConcurrencyException,TechnicalException
     *             ，当数据值被引用时
     */
    public void removeDataValue(DataValueDTO dataValueDto)
            throws ParameterException,ConcurrencyException,TechnicalException,BusinessException;

    /**
     * 根据词条名称查找启用的数据值
     * 
     * @param entryName
     *            不能为null
     * @return 符合条件的数据值列表，没有数据返回null
     */
    public List<DataValueDTO> findEnabledDataValueByEntryName(String entryName)
            throws ParameterException,ConcurrencyException,TechnicalException;

    /**
     * 根据词条名称和键值查找数据值
     * 
     * @param entryName
     *            不能为null
     * @param key
     *            不能为null
     * @return 符合条件的数据值，没有数据返回null
     */
    public DataValueDTO findDataValueByEntryNameAndKey(String entryName,
            String key) throws ParameterException,ConcurrencyException,TechnicalException;

    /**
     * 根据词条Id查询词条实体  
     * @param dataEntryId  dataEntryId不能为null
     * @throws ParameterException
     * @throws ConcurrencyException
     * @throws TechnicalException
     */
   public DataEntryDTO findDataEntryByDataEntryId(Long dataEntryId) throws ParameterException,ConcurrencyException,TechnicalException;

   /**
    * 移动数据值（将fromId对应的数据值排序号修改为toId对应的数据值排序号+1，其它影响到的数据值做相应移动）
    * @param fromId
    * @param toId
    */
   public void moveDataValue(Long fromId,Long toId,Long entryId) throws ParameterException,ConcurrencyException,TechnicalException;
   
   /**
    * 根据数据值id查询数据值
    * @param dataValueId
    * @return
    * @throws ParameterException
    * @throws ConcurrencyException
    * @throws TechnicalException
    */
   public DataValueDTO findDataValueByDataValueId(Long dataValueId) throws ParameterException,ConcurrencyException,TechnicalException;
}
